package com.novellotus.iov.carvice.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * Created by Administrator on 2018/1/1 0001.
 */

public class VinUtil {
    private boolean isStrictCheck = false;

    private static  int[] powers={8,7, 6, 5, 4, 3 ,2, 10, 0, 9, 8, 7, 6, 5, 4, 3 ,2};

    private static Map<String,Integer> values=new HashMap<>();
    static{
        values.put("0", 0);
        values.put("1", 1);
        values.put("2", 2);
        values.put("3", 3);
        values.put("4", 4);
        values.put("5", 5);
        values.put("6", 6);
        values.put("7", 7);
        values.put("8", 8);
        values.put("9", 9);
        values.put("A", 1);
        values.put("B", 2);
        values.put("C", 3);
        values.put("D", 4);
        values.put("E", 5);
        values.put("F", 6);
        values.put("G", 7);
        values.put("H", 8);
        values.put("J", 1);
        values.put("K", 2);
        values.put("L", 3);
        values.put("M", 4);
        values.put("N", 5);
        values.put("P", 7);
        values.put("R", 9);
        values.put("S", 2);
        values.put("T", 3);
        values.put("U", 4);
        values.put("V", 5);
        values.put("W", 6);
        values.put("X", 7);
        values.put("Y", 8);
        values.put("Z", 9);
    }

    /**
     * 检查vin是否正确
     * */
    public static boolean isValid(String vin) {
        boolean isVin=false;
        if(vin!=null&&vin.length()==17){
            isVin= Pattern.matches("^[A-Z0-9]{17}$", vin);

        }
        if(isVin){
            isVin=checkVin(vin);

        }
        return isVin;
    }

    /**
     * 检查VIN号是否合法
     * checkVin
     *
     * @param vin
     * @return true=合法|false=不合法
     */
    public static boolean checkVin(String vin){
        try {
            char[] vins=vin.toUpperCase().toCharArray();
            int result=0;
            for(int i=0;i<vins.length;i++){
                result+=values.get(String.valueOf(vins[i]))*powers[i];
            }
            if(result%11==10){
                return vins[8] == 'X';
            }else{
                return result % 11 == values.get(String.valueOf(vins[8]));
            }
        }catch (Exception e){
            return false;
        }

    }


}
